
//interface
//好比是一个类的说明书
interface IPoint {
    drawPoint: () => void;
    getDistances: (p: IPoint) => number;
    // getX: () => number;
    // setX: (value: number) => void;
    // getY: () => number;
    // setY: (value: number) => void;
    X: number; //用了get、set懒人写法后，在interface中这样声明
    Y: number;
}

//class
//访问修饰符有：public、protect、private
//属性或方法名前不声明修饰符时，默认是public
//参考：https://www.imooc.com/video/23217/0
//为了配合module，在class前加入一个关键词export，导出这个类
export class PointClass implements IPoint {
    // x: number;
    // y: number;

    // constructor(x?: number, y: number = 0) {
    //     this._x = x;
    //     this._x = y;
    // }

    // constructor(public x: number, public y: number = 0) {
    //     //等同于上面的构造函数
    //     //定义构造函数的同时，声明类的公共属性x、y
    // }

    //建议把私有成员变量定义成以下划线开头的
    constructor(private _x: number, private _y: number) {
        
    }

    //方法的访问修饰符默认为public，此处可省略public
    public drawPoint = () => {
        console.log("x: ", this._x, "y: ", this._y);
    }

    getDistances = (p: IPoint) => {
        //pow(a, 2)相当于a的2次方
        //return Math.pow(p.getX() - this._x, 2) + Math.pow(p.getY() - this._y, 2);
        return Math.pow(p.X - this._x, 2) + Math.pow(p.Y - this._y, 2);
        
    }

    // setX = (value: number) => {
    //     if (value < 0) {
    //         throw new Error("x的value不能小于0");
    //     }
    //     this._x = value;
    // }

    // getX = () => {
    //     return this._x;
    // }

    // setY = (value: number) => {
    //     if (value < 0) {
    //         throw new Error("y的value不能小于0");
    //     }
    //     this._y = value;
    // }

    // getY = () => {
    //     return this._y;
    // }

    //get、set懒人写法，一种特殊的写法
    //注意：编译器必须设置为es5及以上 --target=es5，否则报错：error TS1056: Accessors are only available when targeting ECMAScript 5 and higher.
    set X(value: number) {
        if (value < 0) {
            throw new Error("x的value不能小于0");
        }
        this._x = value;
    }

    get X() {
        return this._x;
    }

    set Y(value: number) {
        if (value < 0) {
            throw new Error("y的value不能小于0");
        }
        this._y = value;
    }

    get Y() {
        return this._y;
    }
    

}